package com.wangjie.stackandqueue;

import java.util.Stack;

/**
 * 20. 有效的括号
 *
 * @author jieshao
 * @date 2022/5/7 11:04
 */
public class Test03 {
    public static void main(String[] args) {
        String str1 = "((()()))";
        System.out.println(isValid1(str1));

        String str2 = "([)]";
        System.out.println(isValid2(str2));
    }

    /**
     * 输入一个字符串，其中只包含 () 两种括号，请你判断这个字符串组成的括号是否有效
     *
     * @param str
     * @return
     */
    public static boolean isValid1(String str) {
        // 待匹配的左括号数量
        int left = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '(') {
                left++;
            } else {
                // 遇到右括号
                left--;
            }
            // 右括号太多
            if (left == -1) {
                return false;
            }
        }
        // 是否所有的左括号都被匹配了
        return left == 0;
    }

    /**
     * 输入一个字符串，其中只包含 () {} [] 六种括号，请你判断这个字符串组成的括号是否有效
     *
     * @param str
     * @return
     */
    public static boolean isValid2(String str) {
        Stack<Character> left = new Stack<>();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c == '(' || c == '{' || c == '[') {
                left.push(c);
            } else {
                // 字符 c 是右括号
                if (!left.empty() && leftOf(c) == left.peek()) {
                    left.pop();
                } else {
                    // 和最近的左括号不匹配
                    return false;
                }
            }
        }
        // 是否所有的左括号都被匹配了
        return left.empty();
    }

    public static char leftOf(char c) {
        if (c == '}') {
            return '{';
        }
        if (c == ')') {
            return '(';
        }
        return '[';
    }
}